package pe.com.bbva.modpre.negocio;

import java.io.ByteArrayOutputStream;
import java.io.Serializable;
import java.util.List;
import java.util.Map;

import org.drools.RuleBase;

import pe.com.bbva.modpre.dominio.Ans;
import pe.com.bbva.modpre.dominio.AreaCentral;
import pe.com.bbva.modpre.dominio.ClienteGeneral;
import pe.com.bbva.modpre.dominio.CostoFondeo;
import pe.com.bbva.modpre.dominio.CrPe;
import pe.com.bbva.modpre.dominio.Disponibilidad;
import pe.com.bbva.modpre.dominio.Equipo;
import pe.com.bbva.modpre.dominio.FacturacionMasivaCarga;
import pe.com.bbva.modpre.dominio.Finanza;
import pe.com.bbva.modpre.dominio.Integrante;
import pe.com.bbva.modpre.dominio.LimiteDelegacion;
import pe.com.bbva.modpre.dominio.Lista;
import pe.com.bbva.modpre.dominio.MedioPago;
import pe.com.bbva.modpre.dominio.Parametro;
import pe.com.bbva.modpre.dominio.Producto;
import pe.com.bbva.modpre.dominio.Rar;
import pe.com.bbva.modpre.dominio.Regla;
import pe.com.bbva.modpre.dominio.RiesgoMotor;
import pe.com.bbva.modpre.dominio.Rol;
import pe.com.bbva.modpre.dominio.Segmento;
import pe.com.bbva.modpre.dominio.Sistema;
import pe.com.bbva.modpre.dominio.TipoBanca;
import pe.com.bbva.modpre.dominio.Usuario;
import pe.com.bbva.modpre.dominio.Valor;
import pe.com.bbva.modpre.dominio.VerificarCarga;
import pe.com.bbva.modpre.dominio.VigenciaTasa;
import pe.com.bbva.modpre.dominio.drools.Motor;
import pe.com.bbva.modpre.dominio.quartz.QrtzCronTriggers;
import pe.com.bbva.modpre.dominio.quartz.QrtzJobDetails;
import pe.com.bbva.modpre.dominio.quartz.QrtzTriggers;
import pe.com.bbva.modpre.exception.AlertaException;

import com.vaadin.ui.Window;

public interface ConfiguracionService extends Serializable{

	List<Lista> buscarListas(Lista lista);
	List<Valor> buscarValores(Valor valor);
	List<Parametro> buscarParametros(Parametro parametro);
	Parametro obtenerParametroxCodigo(String codigo);
	void guardarLista(Lista lista);
	void eliminarLista(Long id);
	void guardarValor(Valor valor);
	void eliminarValor(Long id);
	void guardarParametro(Parametro parametro);
	void eliminarParametro(String codigo);
	void guardarVerificarCarga(VerificarCarga verificarCarga);
	List<Valor> obtenerValoresxLista(String codigo);

	List<Producto> obtenerProductos();
	List<Producto> obtenerProductoxTipoBanca(TipoBanca tipoBanca);
	List<Producto> obtenerProductoxTipoOperacion(Valor tipoOperacion);
	List<Producto> buscarProductos(Map<String, Object> map);
	void guardarProducto(Producto producto);
	void eliminarProducto(Long id);
	List<Segmento> obtenerSegmentos();
	List<Rol> obtenerRoles();
	List<Integrante> buscarIntegrantes(Integrante integrante);
	List<Usuario> obtenerUsuariosxEquipo(Equipo equipo);
	List<Usuario> obtenerUsuariosAnalistas();
	void guardarANS(Ans ans);
	void eliminarANS(Long id);
	List<Ans> buscarANS(Ans ans);
	Map<String, List<Equipo>> obtenerMapaEquipos(Map<String, Object> mapFiltro);
	List<Equipo> buscarEquipos(Equipo equipo);
	List<Equipo> obtenerEquiposxPadre(Equipo equipo);
	void guardarEquipo(Equipo equipo);
	void guardarIntegrante(Integrante integrante);
	void eliminarEquipo(Long id);
	void eliminarIntegrante(Long id);
	List<Usuario> listarUsuarios();
	Equipo obtenerEquipoPorId(String id);
	void guardarDisponibilidad(Disponibilidad disponibilidad);
	void eliminarDisponibilidad(Long id);
	void guardarVigenciaTasa(VigenciaTasa vigenciaTasa);
	void eliminarVigenciaTasa(Long id);
	Valor obtenerValorxCodigo(String codigo);
	List<Disponibilidad> buscarDisponibilidad(Disponibilidad disponibilidad);
	List<VigenciaTasa> buscarVigenciaTasa(VigenciaTasa vigenciaTasa);
	
	List<LimiteDelegacion> buscarLimitesDelegacion(LimiteDelegacion limiteDelegacion);
	void guardarLimiteDelegacion(LimiteDelegacion limiteDelegacion);
	void eliminarLimiteDelegacion(Long id);
	List<Integrante> obtenerTodosIntegrantes();
	List<Disponibilidad> disponiblesXSuperior(Disponibilidad disponibilidad);
	List<ClienteGeneral> obtenerClientesGenerales();
	void guardarClientesGenerales(List<ClienteGeneral> clientesG);
	List<FacturacionMasivaCarga> obtenerFacturacionMasivaCarga();
	void guardarFacturacionMasivaCarga(List<FacturacionMasivaCarga> facturacionesMasivas);
	
	ClienteGeneral obtenerClienteGeneralxCodigoCentral(String codigoCentral);
	//Quartz
	List<QrtzCronTriggers> buscarCronTriggers(QrtzCronTriggers qrtzCronTriggers);
	
	List<QrtzJobDetails> buscarJobDetails(QrtzJobDetails qrtzJobDetails);
	
	List<QrtzTriggers> buscarTriggers(QrtzTriggers qrtzTriggers);
	
	void cargarEquipos();
	
	//Drools
	RuleBase obtenerMotor();
	void correrReglas(RuleBase ruleBase, Object object, String regla);
	List<Integrante> buscarIntegrantesxSuperior();
	void cargarVariables();
	void cargarSpreadDatosFinancieros();
	void cargarCostoFondeo();
	void cargarRarBec();
	void cargarRarParConsumo();
	void cargarRarParHipotecario();
	void cargarCrPeBec();
	void cargarCrPeParConsumo();
	void cargarCrPeParHipotecario();
	void cargarEmpresaTop();
	void cargarArchivoCostoFondeo(ByteArrayOutputStream outputStream, Window window);
	void cargarArchivoRar(ByteArrayOutputStream outputStream, Window window,Valor tipoCarga);
	void cargarArchivoCrPe(ByteArrayOutputStream outputStream, Window window,Valor tipoCarga);
	void guardarCostoFondeo(CostoFondeo costoFondeo);
	void guardarRar(Rar rar);
	void guardarCr_Pe(CrPe crPe);
	void eliminarCostoFondeo(Long id);
	void eliminarRar(Long id);
	void eliminarCrPe(Long id);
	void guardarRegla(Regla regla);
	void elimiarRegla(Long id);
	List<CostoFondeo> buscarCostoFondeo(Map<String,Object> map);
	List<Regla> buscarRegla(Regla regla);
	List<Rar> buscarRar(Map<String,Object> map);
	List<CrPe> buscarCrPe(Map<String,Object> map);
	
	void resolverAlertaException(AlertaException alertaException, Window window);
	void resolverException(Throwable cause, Window window);
	void obtenerVariables(String codigoCentral, AreaCentral areaCentral, Finanza finanza, MedioPago medioPago, 
			RiesgoMotor riesgoMotor, Sistema sistema);
	void actualizarArchivoDrools(List<Regla> listaReglas);
	AreaCentral obtenerAreaCentralCodigoCentral(String codCentral);
	Finanza obtenerFinanzaCodigoCentral(String codCentral);
	MedioPago obtenerMedioPagoCodigoCentral(String codCentral);
	RiesgoMotor obtenerRiesgoCodigoCentral(String codCentral);
	Sistema obtenerSistemaCodigoCentral(String codCentral);
	List<Integrante> integrantesxEquipoPadre(Usuario usuario);
	Equipo obtenerEquipoxUsuario(String registro);
	void procesarCuartil();
	void correrReglas(RuleBase ruleBase, String regla, List<Motor> lstobject);
	void exportarValorCliente();
	void exportarFacturacion();
	
}
